﻿#ifndef HTTP_REQUEST_H
#define HTTP_REQUEST_H

#include "const.h"
#include <unordered_map>
#include <string>
#include <regex>

class HttpRequest
{
public:
    // 请求行
    std::string m_method;  // http方法
    std::string m_path;    // 资源路径
    std::string m_version; // http版本
    // 请求报头
    std::unordered_map<std::string, std::string> m_headers; // 头部字段
    // 正文
    std::string m_body;
    // 其他成员
    std::smatch m_matches;                                 //资源路径的正则提取路径
    std::unordered_map<std::string, std::string> m_querys; // 查询字符串
public:
    HttpRequest(const std::string& version = g_defaulthHttpVersion);
    //  设置头部字段
    void setHeader(const std::string &key, const std::string &value);
    // 设置查询字符串
    void setQuery(const std::string &key, const std::string &value);
    // 设置正文
    void setBody(const std::string &body, const std::string &type);
    // 获取正文
    std::string getBody() const;
    // 重置
    void reset();
    // 判断是否存在指定头部字段
    bool hasHeader(const std::string &key) const;
    // 判断是否存在查询字符
    bool hasQuery(const std::string &key) const;
    // 获取指定头部字段
    std::string getHeader(const std::string &key) const;
    // 获取指定查询字符串
    std::string getQuery(const std::string &key) const;
    // 针对某些头部字段的专用函数
    size_t contentLength() const;
    std::string contentType() const;
    // 是不是短连接
    bool close() const;
};


#endif